
            <!DOCTYPE html>
            <html lang="en">
            <head>
                <meta charset="UTF-8">
                <title>K8S从secret文件生成密钥后，如何更新Kubernetes上的密钥呢？</title>
            </head>
            <body>
            <a href="https://andyoung.blog.csdn.net">原作者博客</a>
            <div id="content_views" class="markdown_views prism-atom-one-light">
                    <svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
                        <path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path>
                    </svg>
                    <h2><a id="K8SsecretKubernetes_0"></a>K8S从secret文件生成密钥后，如何更新Kubernetes上的密钥呢？</h2> 
<p><strong>K8S从secret文件生成密钥后，如何更新Kubernetes上的密钥呢？</strong></p> 
<blockquote> 
 <p>最近正式上的ssl证书快过期了，我们来更新下ssl证书</p> 
</blockquote> 
<h4><a id="_4"></a>生成、创建密钥配置</h4> 
<pre><code>kubectl -n cattle-system create secret tls tls-rancher-ingress --cert=./tls.crt --key=./tls.key
</code></pre> 
<h3><a id="_10"></a>方法一</h3> 
<pre><code>kubectl delete secret tls-rancher-ingress -n cattle-system
kubectl -n cattle-system create secret tls tls-rancher-ingress --cert=./tls.crt --key=./tls.key
</code></pre> 
<p>相信大多数的人第一反应，是<strong>先删除，再重新创建secret</strong></p> 
<p>但是此方法存在明显的问题：在删除新建secret的空窗期，是存在风险，平时测试或者不大常用的服务还可以尝试，但是在访问活跃的情况下，会导致大量的异常请求。</p> 
<h3><a id="_21"></a>方法二</h3> 
<h4><a id="dryrunapply_23"></a><strong>通过–dry-run参数预览，然后apply</strong></h4> 
<pre><code>kubectl -n cattle-system create secret tls tls-rancher-ingress --cert=./tls.crt --key=./tls.key --dry-run -o yaml |kubectl apply  -f -
</code></pre> 
<p>方法二在创建secret的时候，添加了–<strong>dry-run</strong>的参数，具体使用方法可参考<em>https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands</em>，该参数的主要作用是预览要发送到集群的对象，而无需真正提交。该方法较方法一更<strong>优雅简单</strong>。</p> 
<h3><a id="_31"></a>方法三</h3> 
<h4><a id="jq_33"></a>使用jq的=或|=运算符来动态更新密钥</h4> 
<pre><code>TLS_KEY=$(base64 &lt; "./tls.key" | tr -d '
')
TLS_CRT=$(base64 &lt; "./tls.crt" | tr -d '
')
kubectl get secrets tls-rancher-ingress -o json 
        | jq '.data["tls.key"] |= "$TLS_KEY"' 
        | jq '.data["tls.crt"] |= "$TLS_CRT"' 
        | kubectl apply -f -
</code></pre> 
<p>方法三尽管它可能不像<code>kubectl create secret tls --dry-run</code>方法那样优雅或简单，但从技术上讲，此方法实际上是在更新值，而不是删除/重新创建它们。还需要<strong>jq</strong>和<strong>base64</strong>（或<code>openssl enc -base64</code>）命令，<strong>tr</strong>是一种常用的Linux实用程序，用于修剪尾随换行符。</p>
                </div>
            </body>
            </html>
            